package com.ssm.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;
import java.util.Vector;

import org.omg.CORBA.PRIVATE_MEMBER;
import org.springframework.web.multipart.MultipartFile;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;

/*
 * 使用sftp的原因
 * 一：FTP要安装，SFTP不要安装。二：SFTP更安全，但更安全带来副作用就是的效率比FTP要低些。
 * */
public class SftpUtil {

	private static final String HOST = "120.79.86.68";
	private static final int PORT = 22;
	private static final String USERNAME = "root";
	private static final String PASSWORD = "Myx10114324";

	/**
	 * 上传文件到指定服务器
	 * @param ip 连接ip
	 * @param user 用户名
	 * @param psw 密码
	 * @param port 端口 <=0 为默认端口
	 * @param fielPath 上传的服务器路径
	 * @param serverFileName 服务器保存的文件名
	 * @param instream 要上传的文件流
	 * @throws Exception
	 */
	public static void sftpFileUpload(String ip,int port, String user, String psw, String fielPath,String serverFileName,InputStream instream) throws Exception {
		Session session =getSession( ip,  user,  psw,  port);
		Channel channel = null;
		try {
			//创建sftp通信通道
			channel = (Channel) session.openChannel("sftp");
			channel.connect(1000);
			ChannelSftp sftp = (ChannelSftp) channel;
			try{
				//跳转到指定目录
				sftp.cd(fielPath);
			}catch(SftpException sException){
				
				if(sftp.SSH_FX_NO_SUCH_FILE == sException.id){
					sftp.mkdir(fielPath);
					sftp.cd(fielPath);
				}
			}
			OutputStream outstream = sftp.put(serverFileName);
			byte b[] = new byte[1024*600];//每次传输200k
			int n;
			while ((n = instream.read(b)) != -1) {
				outstream.write(b, 0, n);
			}
			outstream.flush();
			outstream.close();
			instream.close();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			session.disconnect();
			if (channel!=null)channel.disconnect();
		}
	}
	/**
	 * 从指定服务器下载文件到本地
	 * @param ip 连接ip
	 * @param user 用户名
	 * @param psw 密码
	 * @param port 端口 <=0 为默认端口
	 * @param fielPath 服务器文件路径
	 * @param serverFileName 要下载的文件名
	 * @param outputStream 输出到本地的文件流
	 * @throws Exception
	 */
	public static void sftpFileDownload(String ip,int port, String user, String psw, String fielPath,String serverFileName,OutputStream outputStream) throws Exception {
		Session session =getSession( ip,  user,  psw,  port);
		Channel channel = null;
		try {
			//创建sftp通信通道
			channel = (Channel) session.openChannel("sftp");
			channel.connect(1000);
			ChannelSftp sftp = (ChannelSftp) channel;
			try{
				//进入指定的文件夹
				sftp.cd(fielPath);
			}catch(SftpException sException){
				
				if(sftp.SSH_FX_NO_SUCH_FILE == sException.id){
					sftp.mkdir(fielPath);
					sftp.cd(fielPath);
				}
			}
			sftp.get(serverFileName,outputStream);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			session.disconnect();
			if (channel!=null)channel.disconnect();
		}
	}
	
	/**
	 * 连接服务器
	 * @param ip 服务器地址
	 * @param user 用户名
	 * @param psw  密码
	 * @param port  连接端口
	 * @return
	 * @throws Exception
	 */
	public static Session getSession(String ip, String user, String psw, int port)throws Exception{
		Session session = null;
		JSch jsch = new JSch();
		Properties config = new Properties();
		// 不验证host-key，验证会失败。
		config.put("StrictHostKeyChecking", "no");
		if (port <= 0) {
			//连接服务器，采用默认端口
			session = jsch.getSession(user, ip);
		} else {
			session = jsch.getSession(user, ip, port);
		}
		session.setConfig(config);
		
		session.setPassword(psw);//设置密码
		//设置登陆超时时间
		session.connect(30000);//30s
		return  session;
	}


	/**
	 * 对外提供上传服务器方法
	 * @param inputStream 上传文件输入流
	 * @param fileName 上传文件名
	 * @param userName 操作用户名
	 * @param fileType 上传文件类型：1、头像，2、材料
	 * @return
	 */
	public static String uploadToService(FileInputStream inputStream,String fileName,String userId,Integer fileType){
		String filePath = null;
		String fileUrl = null;
		//根据上传文件类型不同上传至不同的文件夹，按照教师名分类
		if(fileType==1){
			filePath = "/data/upload/headUrl/"+userId;
		}else{
			filePath = "/data/upload/materialFile/"+userId;
		}
		try {
			//上传文件
			sftpFileUpload(HOST, PORT, USERNAME, PASSWORD, filePath, fileName, inputStream);
			fileUrl = "http://"+HOST+":8080"+filePath+"/"+fileName;
			System.out.println("上传成功");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("上传失败");
		}
		return fileUrl;
	}
	
	/**
	 * 对外提供封装后下载方法
	 * @param materialPath
	 * @return
	 */
	public static String downloadFile(String materialPath){
		//materialPath = http://120.79.86.68:8080/upload/materialFile/5009/hibernate要点记录.pdf
		String filePath = "/data/upload/materialFile/" + materialPath.substring(45,49);
		String fileName = materialPath.substring(50);
		File file = new File("D:\\upload\\materialFile\\" + materialPath.substring(45,49));
		//如果是文件夹并且不存在，创建文件夹
		if(!file.exists() && !file.isDirectory()){
			file.mkdirs();
		}
		try {
			String downPath = file.getPath() + "\\" + fileName;
			OutputStream outputStream = new FileOutputStream(downPath);
			sftpFileDownload(HOST, PORT, USERNAME, PASSWORD, filePath, fileName, outputStream);
			System.out.println("下载成功");
			return downPath;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 测试main方法
	 * @param args
	 */
	public static void main(String[] args) {
		/*File f = new File("D:/upload/190653-106.jpg");
		FileInputStream inputStream = null;
		try {
			inputStream = new FileInputStream(f);
			String fileUrl = uploadToService(inputStream, "190653-106.jpg", "1001", 2);
			System.out.println("文件地址："+fileUrl);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}*/
		String severPath = "http://120.79.86.68:8080/upload/materialFile/5009/hibernate要点记录.pdf";
		try {
			String path = downloadFile(severPath);
			System.out.println("文件下载地址为："+path);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}


}